package com.tansun.easycare.rule.common;

import org.apache.commons.lang.StringUtils;

/**
 * 用于规则集解析参数，除此之外还有EquationParse,FuncParse
 * 包含两种形式：
 * 	1、 输入ruleHelper.getValue() 需要两个参数 dataSetName，paramName
 *  2、输出ruleHelper.setValue() 需要三个参数 dataSetName，paramName，val
 *  3、集合项取值 ruleHelper.getValue().get().get() 需要四个参数dataSetName，paramName，indexStr，keyName
 * @author xuconghui
 * @date 2020年4月17日
 */
public class ParamParse {

	public static final int SITE_GENERAL = 0;//参数位置，一般位置
	public static final int SITE_FOR = 1;///参数位置，for循环内
	public static final int SITE_FUNC = 2;///参数位置，函数入参之内
	
	public static final int USED_IN = 0;//参数用途,输入
	public static final int USED_OUT = 1;//参数用途,输出
	public static final int USED_REF = 2;//参数用，被引用，用于list Map
	public static final int USED_IN_LIST = 3;//参数用途，当前为集合，且选取集合项
	
	public static String mapStr = "$insertMap";//参数存储map
	
	private String dataSetName;//数据集名称
	
	private String paramName;//参数名称
	
	/**
	 * 数据类型,为从页面解析出的原始数据
	 */
	private String dataType;
	
	/**
	 * 数据类型
	 * 取值为
	 * 	基础数据类型
	 * 	object
	 * 	list
	 */
	private ParamParse typeObj;
	
	/**
	 * 数据类型
	 * 0 = 未知 
	 * 1 = 基础数据类型
	 * 2 = list 内部为基础数据类型
	 * 3 = list 内部Obejct 
	 * 4 = Object
	 */
	private Integer type;

	/**
	 * 参数用途
	 * 0 = 输入
	 * 1 = 输出
	 */
	private Integer usedType; 
	
	/**
	 * 参数位置
	 * 0 = 普通参数位置，直接使用
	 * 1 = for循环中的参数引用，循环项
	 * 2 = 用于函数入参之内
	 */
	private Integer siteType;
	
	/**
	 * 赋值的val
	 */
	private String val;
	
	/**
	 * 集合取值的索引
	 */
	private String indexStr;
	
	/**
	 * 集合项取值的key
	 */
	private String keyName;
	
	public ParamParse() {
		super();
	}

	public String getDataSetName() {
		return dataSetName;
	}

	public void setDataSetName(String dataSetName) {
		this.dataSetName = dataSetName;
	}

	public String getParamName() {
		return paramName;
	}

	public void setParamName(String paramName) {
		this.paramName = paramName;
	}

	public String getDataType() {
		return this.changeType(dataType);
	}

	public void setDataType(String dataType) {
		this.dataType = dataType;
	}

	public ParamParse getTypeObj() {
		return typeObj;
	}

	public void setTypeObj(ParamParse typeObj) {
		this.typeObj = typeObj;
	}

	public Integer getType() {
		return type;
	}

	public void setType(Integer type) {
		this.type = type;
	}

	public int getUsedType() {
		return usedType;
	}

	public void setUsedType(Integer usedType) {
		this.usedType = usedType;
	}

	public int getSiteType() {
		return siteType;
	}

	public void setSiteType(Integer siteType) {
		this.siteType = siteType;
	}

	public String getVal() {
		return val;
	}

	public void setVal(String val) {
		this.val = val;
	}
	
	public String getIndexStr() {
		return indexStr;
	}

	public void setIndexStr(String indexStr) {
		this.indexStr = indexStr;
	}

	public String getKeyName() {
		return keyName;
	}

	public void setKeyName(String keyName) {
		this.keyName = keyName;
	}

	public boolean isNull() {
		return this.dataSetName ==  null &&
				this.paramName == null &&
				this.dataType == null &&
				this.siteType == null &&
				this.usedType == null;
	} 
	
    /**
     * 需要将Date转为String
     * @param datatype
     * @return
     */
    public String changeType(String datatype) {
    	if("date".equalsIgnoreCase(datatype)) {
    		return "String";
    	}else {
    		return datatype;
    	}
    }
    
	@Override
	public String toString() {
		if( this.usedType != null && this.siteType != null ) {
			if( USED_IN == this.usedType ) {
				if( SITE_GENERAL == this.siteType ) {
					return "(("+dataType+")ruleHelper.getValue("+mapStr+",\""+dataSetName+"."+paramName+"\"))";
				}else if( SITE_FUNC == this.siteType ) {
					return "(("+dataType+")ruleHelper.getValue("+mapStr+",\""+dataSetName+"."+paramName+"\"))";
					//return "this[\""+dataSetName+"\"][\""+paramName+"\"]";
				}else if( SITE_FOR == this.siteType ) {
					return "("+typeObj.getDataType()+")"+dataSetName+".get(\""+paramName+"\")";
				}
			}else if( USED_OUT == this.usedType ){
				if( SITE_GENERAL == this.siteType ) {
					return "ruleHelper.setValue("+mapStr+",\""+dataSetName+"."+paramName+"\","+val+")";
					//return "this[\""+dataSetName+"\"][\""+paramName+"\"]";
				}else if( SITE_FUNC == this.siteType ) {
					//return "this[\""+dataSetName+"\"][\""+paramName+"\"]";
					return "ruleHelper.setValue("+mapStr+",\""+dataSetName+"."+paramName+"\","+val+")";
				}else if( SITE_FOR == this.siteType ) {
					return dataSetName+".put(\""+paramName+"\","+val+")";
				}
			}else if( USED_IN_LIST == this.usedType) {
				if(StringUtils.isNotEmpty(this.keyName)) {
					return "(("+typeObj.getDataType()+")((Map)((List)ruleHelper.getValue("+mapStr+",\""+dataSetName+"."+paramName+"\")).get("+this.indexStr+")).get(\""+keyName+"\"))";
				}else {
					return "((Map)((List)ruleHelper.getValue("+mapStr+",\""+dataSetName+"."+paramName+"\")).get("+this.indexStr+"))";
				}
			}
		}
		return "ParamParse [dataSetName=" + dataSetName + ", paramName=" + paramName + ", dataType=" + dataType
				+ ", type=" + type + ", usedType=" + usedType + ", siteType=" + siteType + "]";
	}
}
